home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / nihcl-30.lha / nihcl-3.0 / lib / StackProc.c < prev    next >
C/C++ Source or Header  |  1990-05-19  |  4KB  |  151 lines

  1. /* StackProc.c -- Implementation of Process with stack shared with main() process
  2.  
  3.     THIS SOFTWARE FITS THE DESCRIPTION IN THE U.S. COPYRIGHT ACT OF A
  4.     "UNITED STATES GOVERNMENT WORK".  IT WAS WRITTEN AS A PART OF THE
  5.     AUTHOR'S OFFICIAL DUTIES AS A GOVERNMENT EMPLOYEE.  THIS MEANS IT
  6.     CANNOT BE COPYRIGHTED.  THIS SOFTWARE IS FREELY AVAILABLE TO THE
  7.     PUBLIC FOR USE WITHOUT A COPYRIGHT NOTICE, AND THERE ARE NO
  8.     RESTRICTIONS ON ITS USE, NOW OR SUBSEQUENTLY.
  9.  
  10. Author:
  11.     K. E. Gorlen
  12.     Bg. 12A, Rm. 2033
  13.     Computer Systems Laboratory
  14.     Division of Computer Research and Technology
  15.     National Institutes of Health
  16.     Bethesda, Maryland 20892
  17.     Phone: (301) 496-1111
  18.     uucp: uunet!nih-csl!kgorlen
  19.     Internet: kgorlen@alw.nih.gov
  20.     January, 1988
  21.  
  22. Function:
  23.     
  24. Modification History:
  25.  
  26. $Log:    StackProc.c,v $
  27.  * Revision 3.0  90/05/20  00:21:30  kgorlen
  28.  * Release for 1st edition.
  29.  * 
  30. */
  31.  
  32. #include "StackProc.h"
  33. #include "Scheduler.h"
  34. #include "nihclIO.h"
  35.  
  36. #define    THIS    StackProc
  37. #define    BASE    Process
  38. #define    BASE_CLASSES BASE::desc()
  39. #define    MEMBER_CLASSES
  40. #define    VIRTUAL_BASE_CLASSES
  41.  
  42. DEFINE_ABSTRACT_CLASS(StackProc,1,"$Header: /afs/alw.nih.gov/unix/sun4_40c/usr/local/src/nihcl-3.0/share/lib/RCS/StackProc.c,v 3.0 90/05/20 00:21:30 kgorlen Rel $",NULL,NULL);
  43.  
  44. StackProc::StackProc(const char* name, stackTy* bottom, int priority, unsigned long size)
  45.     : BASE(name, bottom, priority)
  46. {
  47.     stack_top = topOfStack();
  48.     stack_save_size = size;
  49.     if (size != 0) stack_save = new stackTy[size];
  50.     else stack_save = 0;
  51.     saveStack();
  52. }
  53.  
  54. StackProc::StackProc(stackTy* bottom, int priority)
  55.     : BASE(bottom, priority)
  56. // contructor for MAIN process
  57. {
  58.     stack_top = bottom;
  59.     stack_save = 0;
  60.     stack_save_size = 0;
  61.     Scheduler::main_stack_process = this;
  62.     add();            // add MAIN process to Scheduler runlist
  63. }
  64.  
  65. StackProc::StackProc(OIOifd& fd) : BASE(fd) {}
  66.  
  67. StackProc::StackProc(OIOin& strm) : BASE(strm) {}
  68.  
  69. StackProc::~StackProc()
  70. {
  71.     delete stack_save;
  72. }
  73.  
  74. void StackProc::saveStack()
  75. // save the stack for this Process
  76. {
  77. #if STACK_GROWS_DOWN
  78.     unsigned long size = stack_bottom - stack_top;
  79. #else
  80.     unsigned long size = stack_top - stack_bottom;
  81. #endif
  82.     if (stack_save_size < size) {
  83.         if (stack_save_size != 0) delete stack_save;
  84.         stack_save = new stackTy[size];
  85.         stack_save_size = size;
  86.     }
  87.  
  88. #ifdef sparc
  89.     asm("t    0x03");        // ST_FLUSH_WINDOWS
  90. #endif
  91.  
  92. #if STACK_GROWS_DOWN
  93.     copyStack(stack_top+1, stack_save, size);
  94. #else
  95.     copyStack(stack_bottom, stack_save, size);
  96. #endif
  97. }
  98.  
  99. void StackProc::restoreStack(const stackTy* palloc)
  100. {
  101.     Scheduler::main_stack_process = (StackProc*)Scheduler::active_process;
  102.  
  103. #if STACK_GROWS_DOWN
  104.     if (palloc != stack_top+1) {
  105.         cerr << "StackProc::restoreStack() assertion failed\n";
  106.         abort();
  107.     }
  108.     copyStack(stack_save, stack_top+1, stack_bottom-stack_top);
  109. #else
  110.     if (palloc != Scheduler::main_stack_bottom) {
  111.         cerr << "StackProc::restoreStack() assertion failed\n";
  112.         abort();
  113.     }
  114.     copyStack(stack_save, stack_bottom, stack_top-stack_bottom);
  115. #endif
  116.  
  117.     LONGJMP(((StackProc*)Scheduler::active_process)->env, Scheduler::resume_new_process);
  118. }
  119.  
  120. unsigned StackProc::size() const
  121. {
  122. #if STACK_GROWS_DOWN
  123.     return stack_bottom - stack_top;
  124. #else
  125.     return stack_top - stack_bottom;
  126. #endif
  127. }
  128.  
  129. void StackProc::switchContext(Process* new_process)
  130. {
  131.     stack_top = topOfStack();
  132.     save();
  133.     new_process->switchFrom(this);
  134. }
  135.  
  136. void StackProc::switchFrom(HeapProc*)
  137. // switch from active HeapProc to next StackProc
  138. {
  139.     if (Scheduler::main_stack_process == this)
  140.         LONGJMP(env, Scheduler::resume_new_process);
  141.     Scheduler::main_stack_process->saveStack();
  142.     _LONGJMP(Scheduler::switcher, 1);
  143. }
  144.  
  145. void StackProc::switchFrom(StackProc* active)
  146. // switch from active StackProc to next StackProc
  147. {
  148.     active->saveStack();
  149.     _LONGJMP(Scheduler::switcher, 1);
  150. }
  151.